home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 4
/
Amiga Tools 4.iso
/
tools
/
disk-tools
/
harddisk
/
rdbmount_1_2
/
tool.c
< prev
Wrap
C/C++ Source or Header
|
1993-03-28
|
9KB
|
334 lines
/* $Revision Header *** Header built automatically - do not edit! ***********
*
* (C) Copyright 1992 by Torsten Jürgeleit
*
* Name .....: tool.c
* Created ..: Wednesday 19-Feb-92 10:05:27
* Revision .: 2
*
* Date Author Comment
* ========= ==================== ====================
* 27-Apr-92 Torsten Jürgeleit add no library option
* 11-Mar-92 Torsten Jürgeleit argv[ARGUMENT_UNIT] is a (BYTE *)
* 19-Feb-92 Torsten Jürgeleit Created this file!
*
****************************************************************************
*
* Tool for manipulating hardblocks
*
* $Revision Header ********************************************************/
/* Includes */
#include <exec/types.h>
#include <devices/hardblocks.h>
#include <libraries/arpbase.h>
#include <functions.h>
#include <stdlib.h>
#ifndef LINK_TEST
#include "hardblocks.h"
#else /* LINK_TEST */
#include "hardblocks_link.h"
#endif /* LINK_TEST */
/* Defines */
#define DEFAULT_DEVICE "scsi.device"
#define DEFAULT_UNIT "0"
#define MAX_ARGUMENTS 11
#define ARGUMENT_DEVICE 0
#define ARGUMENT_UNIT 1
#define ARGUMENT_FILE 2
#define ARGUMENT_LOAD 3
#define ARGUMENT_RESTORE 4
#define ARGUMENT_DEFAULT 5
#define ARGUMENT_SHOW 6
#define ARGUMENT_OUTPUT 7
#define ARGUMENT_SAVE 8
#define ARGUMENT_BACKUP 9
#define ARGUMENT_REMOVE 10
/* Externals */
IMPORT struct DOSBase *DOSBase;
/* Globals */
struct ArpBase *ArpBase;
#ifndef LINK_TEST
struct Library *HardBlocksBase;
#endif /* LINK_TEST */
BYTE template[] = "Device,Unit,FILE/k,LOAD/s,RESTORE/s,DEFAULT/s,SHOW/s,"
"OUTPUT/k,SAVE/s,BACKUP/s,REMOVE/s", xtra_help[] = "HBtool v1.1 - Copyright © 1992 Torsten Jürgeleit\n\n"
"Usage: HBtool [Device] [Unit] [FILE name] [LOAD]"
" [RESTORE] [DEFAULT] [SHOW] [OUTPUT file] [SAVE]"
" [BACKUP] [REMOVE]\n"
"\t[Device] = device name (default: scsi.device)\n"
"\t[Unit] = device unit num (default 0)\n"
"\t[FILE name] = file to restore/save hardblocks\n"
"\t[LOAD] = load hardblocks from device (default)\n"
"\t[RESTORE] = restore hardblocks from file\n"
"\t[DEFAULT] = create standard rigid disk block\n"
"\t[SHOW] = show currently loaded hardblocks (default)\n"
"\t[OUTPUT file] = output file for show (default: NULL -> stdout)\n"
"\t[SAVE] = save currently loaded hardblocks to device\n"
"\t[BACKUP] = backup currently loaded hardblocks to file\n"
"\t[REMOVE] = delete rigid disk block from device";
/* Prototypes */
LONG _main(LONG alen, BYTE * aptr);
BOOL safety_check(BYTE * device, ULONG unit);
/* Main routine - no startup code */
LONG
_main(LONG alen, BYTE * aptr)
{
LONG return_code = RETURN_FAIL;
/* First open ARP library */
if (!(ArpBase = OpenLibrary(ArpName, ArpVersion)))
{
Write(Output(), "Need ARP library V39+\n", 22L);
}
else
{
#ifndef LINK_TEST
if (!(HardBlocksBase = OpenLibrary(HardBlocksName,
HardBlocksVersion)))
{
Puts("Need hardblocks library");
}
else
{
#endif /* LINK_TEST */
BYTE *argv[MAX_ARGUMENTS];
USHORT i;
/* Clear argument array */
for (i = 0; i < MAX_ARGUMENTS; i++)
{
argv[i] = NULL;
}
/* Parse command line arguments */
if (GADS(aptr, alen, &xtra_help[0], &argv[0], &template[0]) < 0)
{
Puts(argv[0]);
}
else
{
struct RigidDiskBlock rdb;
BPTR fh;
BYTE *device, *file = argv[ARGUMENT_FILE];
ULONG unit;
USHORT error;
/* Install default arguments if not present */
if (!argv[ARGUMENT_DEVICE])
{
argv[ARGUMENT_DEVICE] = DEFAULT_DEVICE;
}
device = argv[ARGUMENT_DEVICE];
if (!argv[ARGUMENT_UNIT])
{
argv[ARGUMENT_UNIT] = DEFAULT_UNIT;
}
unit = Atol(argv[ARGUMENT_UNIT]);
if (!argv[ARGUMENT_LOAD] && !argv[ARGUMENT_RESTORE] &&
!argv[ARGUMENT_DEFAULT] && !argv[ARGUMENT_REMOVE])
{
argv[ARGUMENT_LOAD] = (BYTE *) - 1L;
}
if (!argv[ARGUMENT_SHOW] && !argv[ARGUMENT_SAVE] &&
!argv[ARGUMENT_BACKUP] && !argv[ARGUMENT_REMOVE])
{
argv[ARGUMENT_SHOW] = (BYTE *) - 1L;
}
/* Get output file handle for show */
if (argv[ARGUMENT_SHOW])
{
BYTE *output = argv[ARGUMENT_OUTPUT];
if (!output)
{
fh = Output();
}
else
{
if (!(fh = Open(output, (LONG) MODE_NEWFILE)))
{
Printf("Can't open '%s'\n", output);
error = HBERR_FILE_OPEN_FAILED;
}
}
}
/* Load hardblocks from device */
if (!error && argv[ARGUMENT_LOAD])
{
Printf("Loading hardblocks from unit %ld of `%s'\n", unit,
device);
if (!(error = LoadHardBlocks(&rdb, device, unit)))
{
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW])
{
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_BACKUP])
{
if (!file)
{
Printf("No backup file name\n");
error = HBERR_FILE_OPEN_FAILED;
}
else
{
Printf("Backup hardblocks to `%s'\n", file);
error = BackupHardBlocks(&rdb, file);
}
}
FreeHardBlocks(&rdb);
}
}
/* Restore hardblocks from file */
if (!error && argv[ARGUMENT_RESTORE])
{
if (!file)
{
Printf("No restore file name\n");
error = HBERR_FILE_OPEN_FAILED;
}
else
{
Printf("Restoring hardblocks from `%s'\n", file);
if (!(error = RestoreHardBlocks(&rdb, file)))
{
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW])
{
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_SAVE])
{
Printf("Saving hardblocks to unit %ld of"
" `%s'\n", unit, device);
if (safety_check(device, unit) == TRUE)
{
error = SaveHardBlocks(&rdb, device, unit);
}
}
FreeHardBlocks(&rdb);
}
}
}
/* Create standard rigid disk block */
if (!error && argv[ARGUMENT_DEFAULT])
{
Printf("Creating standard rigid disk block for unit %ld"
" of `%s'\n", unit, device);
if (!(error = InitRigidDiskBlock(&rdb, device, unit)))
{
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW])
{
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_SAVE])
{
Printf("Saving hardblocks to unit %ld of `%s'\n", unit,
device);
if (safety_check(device, unit) == TRUE)
{
error = SaveHardBlocks(&rdb, device, unit);
}
}
if (!error && argv[ARGUMENT_BACKUP])
{
if (!file)
{
Printf("No backup file\n");
error = HBERR_FILE_OPEN_FAILED;
}
else
{
Printf("Backup hardblocks to `%s'\n", file);
error = BackupHardBlocks(&rdb, file);
}
}
FreeHardBlocks(&rdb);
}
}
/* Delete rigid disk block */
if (!error && argv[ARGUMENT_REMOVE])
{
Printf("Removing hardblocks from unit %ld of `%s'\n", unit,
device);
if (safety_check(device, unit) == TRUE)
{
error = RemoveHardBlocks(device, unit);
}
}
/* Close output file handle opened for show */
if (argv[ARGUMENT_SHOW] && argv[ARGUMENT_OUTPUT])
{
Close(fh);
}
/* Print error msg */
if (error)
{
Printf("Error: primary=%d secondary=%ld\n", error, IoErr());
}
else
{
return_code = RETURN_OK;
}
}
#ifndef LINK_TEST
CloseLibrary(HardBlocksBase);
}
#endif /* LINK_TEST */
CloseLibrary(ArpBase);
}
/* MANX crt0.asm forget to close DOS library, so we have to do it */
CloseLibrary(DOSBase);
return (return_code);
}
/* Safety check before any writing to device unit */
STATIC BOOL
safety_check(BYTE * device, ULONG unit)
{
BYTE buffer[MaxInputBuf];
BOOL answer = FALSE;
Printf("DANGER: Do you really want to change hardblocks on unit %ld of\n"
" device `%s' (YES|NO)? ", unit, device);
ReadLine(&buffer[0]);
if (strcmp(&buffer[0], "YES"))
{
Puts("Change aborted");
}
else
{
answer = TRUE;
}
return (answer);
}